/*
 * $Id: muscl-ast-loop.h 355 2010-05-27 03:37:50Z cmtonkinson@gmail.com $
 *
 * This file is part of the Symphony project <http://code.google.com/p/symphonymud/>
 * Copyright 2005-2010 Chris Tonkinson <cmtonkinson@gmail.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef H_SYMPHONY_MUSCL_AST_LOOP
#define H_SYMPHONY_MUSCL_AST_LOOP

#include "muscl-ast.h"

class AstReference;
class Datum;

class AstLoop: public Ast {
  public:
    // constructors...
    AstLoop( void );
    AstLoop( const unsigned& type, AstReference* iterator, Ast* expression1, Ast* expression2, Ast* bodycode );
    virtual ~AstLoop( void );

    // public accessors...
    void          iterator( AstReference* iterator )    { _iterator = iterator; }
    AstReference* iterator( void )                      { return _iterator; }
    void          expression1( Ast* expression1 )       { _expression1 = expression1; }
    Ast*          expression1( void )                   { return _expression1; }
    void          expression2( Ast* expression2 )       { _expression2 = expression2; }
    Ast*          expression2( void )                   { return _expression2; }
    void          bodycode( Ast* bodycode )             { _bodycode = bodycode; }
    Ast*          bodycode( void )                      { return _bodycode; }

    // general methods...
    virtual Datum*      eval( void );
    virtual void        print( std::string indent, bool last );
    virtual InstrList&  codegen( void );

  private:
    // data...
    AstReference* _iterator;
    Ast*          _expression1;
    Ast*          _expression2;
    Ast*          _bodycode;
};

#endif // H_SYMPHONY_MUSCL_AST_LOOP
